#ifndef _MODULES_H_CSEAPI_
#define _MODULES_H_CSEAPI_

class CSE_IMPEXP_IN TCseRegister
{
public:
    TBool exist(const TCharArray& key);
    TCseObj get(const TCharArray& key);
    const TCseObj& set(const TCharArray& key, const TCseObj& value);
    void remove(const TCharArray& key);

    TCseObj hold(const TCseObj& value);
};

extern CSE_IMPEXP_IN TCseRegister *CseRegister;

class CSE_IMPEXP_IN TCseModule: public TCseObj
{
public:
    TCseModule(const TCharArray& sModule, TBool OnlyTopLevel=false);
    TCseModule(const TCseObj& module);

    static TCharArray searchFile(const TCharArray& sModule, const TCharArray& RefFile=CseEmptyStr);
    static TCseObj getModule(const TCharArray& sModule, TBool OnlyTopLevel=false);
    static void setModule(const TCharArray& sModule, const TCseObj& mod);

    static TCseModule create(const TCharArray& sModule, TBool regist=true);
    static TCseModule loadCsd(const TCharArray& sModule, const TCharArray& RefFile=CseEmptyStr);
    static void unloadAll(TBool safeExit=false);

    TBool uses(const TCseModule& module) const;

    void clear() const;
    const TCseObj& attrSet(const TCharArray& attr, const TCseObj& value) const;
    TCseObj attrGet(const TCharArray& attr) const;

    int addSymAddr(TInt iAddr) const;
    int addExitFunc(void *func) const;
    int addModuleVar(const TCseObj& var) const;
    TBool addSubModule(const TCharArray& name, const TCseObj& SubModule) const;
};

extern CSE_IMPEXP_IN void CseModules_init(int argc, TXchar **argv);
extern CSE_IMPEXP_IN void CseModules_exit();

#endif
